package com.xuecheng.order.service;

import com.xuecheng.framework.domain.task.XcTask;
import com.xuecheng.framework.domain.task.XcTaskHis;
import com.xuecheng.order.dao.XcTaskHisRepository;
import com.xuecheng.order.dao.XcTaskRepository;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.Optional;

@Service
public class TaskService {

    @Autowired
    XcTaskRepository xcTaskRepository;
    @Autowired
    RabbitTemplate rabbitTemplate;
    @Autowired
    XcTaskHisRepository hisRepository;

   // 查询某时间前n条任务记录
    public List<XcTask> findXctaskList(int size,Date time){
        Pageable pageable = new PageRequest(0,size);
        Page<XcTask> all = xcTaskRepository.findByUpdateTimeBefore(pageable, time);
        return all.getContent();
    }

    // 向MQ发送消息
    public void sendTaskMsg(String ex,String key,XcTask xcTask){
        // 先查添加选课询消息是否存在，有责需要发送
        Optional<XcTask> optional = xcTaskRepository.findById(xcTask.getId());
        if (optional.isPresent()){
            XcTask xcTask1 = optional.get();
            rabbitTemplate.convertAndSend(ex,key,xcTask);
            // 更新消息的时间
            xcTask.setUpdateTime(new Date());
            xcTaskRepository.save(xcTask);
        }
    }

    // 发送任务
    public void publish(String ex,String key,XcTask xcTask){
        rabbitTemplate.convertAndSend(ex,key,xcTask);
        Optional<XcTask> optional = xcTaskRepository.findById(xcTask.getId());
        if (optional.isPresent()){
            XcTask xcTask1 = optional.get();
            xcTask.setUpdateTime(new Date());
            xcTaskRepository.save(xcTask1);
        }
    }

    // 从数据库获取任务
    @Transactional
    public int getTask(String id, int version){
        return xcTaskRepository.updateByTaskVersion(id, version);
    }

    // 完成任务
    @Transactional
    public void finshTask(String id){
        // 查询任务
        Optional<XcTask> optional = xcTaskRepository.findById(id);
        if (optional.isPresent()){
            XcTask task = optional.get();
            // 向任务历史表添加
            XcTaskHis taskHis = new XcTaskHis();
            BeanUtils.copyProperties(task,taskHis);
            hisRepository.save(taskHis);
            // 删除原有的任务
            xcTaskRepository.delete(task);
        }
    }

}
